/*
Copyright 2000-2011 Francois de Bertrand de Beuvron

This file is part of CoursBeuvron.

CoursBeuvron is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

CoursBeuvron is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with CoursBeuvron.  If not, see <http://www.gnu.org/licenses/>.
 */
package fr.insa.beuvron.tps.m2.dessin2DV1;

import fr.insa.commun.Lire;

/**
 *
 * @author FdB
 */
public class EnsembleFigure {

    public static final int MAX_FIGURES = 1000;
    /**
     * contient les figures définies entre 0 et nbrFigs-1, puis contient null
     */
    private Figure[] lesFigs;
    /**
     * nombre de figures effectivement définies dans le tableau
     */
    private int nbrFigs;
    
    public EnsembleFigure() {
        this.lesFigs = new Figure[MAX_FIGURES];
        this.nbrFigs = 0;
    }

    /**
     * permet de demander le type de la figure que l'utilisateur souhaite créer,
     * et appelle la méthode de création correspondante dans les sous-classes
     * de Figure.
     * @return la figure crée par l'utilisateur
     */
    public static Figure entreFigure() {
        char rep = 'u';
        Figure res = null;
        while (rep != 'P' && rep != 'S') {
            System.out.println("creation d'un Point ou d'un Segment (P ou S) : ");
            rep = Lire.c();
            rep = Character.toUpperCase(rep);
            if (rep == 'P') {
                res = Point.demande();
            } else if (rep == 'S') {
                res = Segment.demande();
            } else {
                System.out.println("erreur : entrez la lettre P ou S");
            }
        }
        return res;
    }

    /**
     * Affiche un ensemble de figures contenues dans un tableau
     * @return une description de toutes les figures
     */
    public void afficheListe() {
        System.out.println("----------- figures ----------------");
        for (int i = 0; i < this.nbrFigs; i++) {
            System.out.println((i + 1) + " : " + this.lesFigs[i]);
        }
        System.out.println("------------------------------------");
    }

    /**
     * permet à l'utilisateur de choisir une figures parmis toutes les figures
     * définies dans le tableau
     * @return le numéro de la case du tableau (0...nbrFigs-1) contenant la figure
     * choisie par l'utilisateur, ou -1 si l'utilisateur souhaite annuler 
     * la selection
     */
    public int choisiFigure(String message) {
        int rep = -1;
        while (rep < 0 || rep > this.nbrFigs) {
            this.afficheListe();
            System.out.println(message);
            System.out.println("donnez un numéro de figure (ou 0 pour annuler) : ");
            rep = Lire.i();
        }
        return rep - 1;
    }

    /**
     * supprime une figure spécifiée par sa position dans le tableau
     * @param numToDel numéro de case de la figure a supprimer
     */
    public void supprimeFigure(int numToDel) {
        if (numToDel >= this.nbrFigs) {
            throw new Error("numéro de figure non définie : " + numToDel
                    + " (devrait être < " + this.nbrFigs + ")");
        }
        // je décide que l'ordre des figures a de l'importance dans le tableau
        // je décale donc toutes les figures au dessus de numToDel
        for (int i = numToDel; i < this.nbrFigs; i++) {
            this.lesFigs[i] = this.lesFigs[i + 1];
        }
        this.nbrFigs--;
        this.lesFigs[this.nbrFigs] = null;
    }

    /**
     * ajoute une figure dans le tableau.
     * Note : on aurait pu prévoir de créer un tableau plus grand quand il
     * n'y a plus de place. Ici, on signale simplement une erreur
     */
    public void ajouteFigure(Figure fig) {
        if (this.nbrFigs == this.lesFigs.length) {
            throw new Error("impossible d'ajouter une figure : le tableau est plein)");
        }
        this.lesFigs[this.nbrFigs] = fig;
        this.nbrFigs++;
    }
    
    public int nbrFigs() {
        return this.lesFigs.length;
    }

    public void menu() {
        int rep = -1;
        while (rep != 0) {
            System.out.println("voulez vous : ");
            System.out.println("1) afficher toutes les figures");
            System.out.println("2) créer une nouvelle figure");
            System.out.println("3) supprimer une figure");
            System.out.println("");
            System.out.println("0) quitter");
            System.out.println("votre choix : ");
            rep = Lire.i();
            if (rep == 1) {
                this.afficheListe();
            } else if (rep == 2) {
                if (this.nbrFigs == this.lesFigs.length) {
                    System.out.println("nombre max de figures atteint");
                    System.out.println("impossible d'en créer une nouvelle");
                } else {
                    this.ajouteFigure(entreFigure());
                }
            } else if (rep == 3) {
                int num = this.choisiFigure("indiquez la figure à supprimer");
                if (num != -1) {
                    this.supprimeFigure(num);
                }
            }
        }
    }

    public static void main(String[] args) {
        EnsembleFigure scene = new EnsembleFigure();
        scene.lesFigs = new Figure[MAX_FIGURES];
        scene.nbrFigs = 0;
        scene.menu();
    }

}
